﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Entidades.Basicas;
using System.Data;
using System.Web.Caching;
using System.Drawing;


namespace TCC_Hotel.Apresentacao.Funcionarios
{
    public partial class ListarFuncionarios : System.Web.UI.Page
    {

        List<Funcionario> funcionarios = null;
        FuncionarioService servico = new FuncionarioService();
        LoginService servico_Login = new LoginService();

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Listar_Funcionarios)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Funcionarios)
            {
                //Redireciona para a pagina inicial
                btnCadastrar.Visible = false;

                //tira as colunas nao permitida do usuario
                for (int i = 0; i < grdFuncionarios.Columns.Count; i++)
                {
                    if (grdFuncionarios.Columns[i].AccessibleHeaderText == "Editar")
                    {
                        grdFuncionarios.Columns[i].Visible = false;
                    }
                }
            }

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Desligar_Funcionarios)
            {
                //tira as colunas nao permitida do usuario
                for (int i = 0; i < grdFuncionarios.Columns.Count; i++)
                {
                    if (grdFuncionarios.Columns[i].AccessibleHeaderText == "Desligar")
                    {
                        grdFuncionarios.Columns[i].Visible = false;
                    }
                }

            }

            if (!IsPostBack)
            {
                //recupera todos os funcionarios do banco de dados          
                ReloadGridView();
            }
        }

        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdFuncionarios_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "detalharFuncionario")
            {

                //Redireciona para a pagina de detalhes correspondente com o CPF como parametro
                Response.Redirect("~/Apresentacao/Funcionarios/DetalharFuncionario.aspx?cpf=" + grdFuncionarios.Rows[Convert.ToInt16(e.CommandArgument)].Cells[2].Text);



            }
            else if (e.CommandName == "editarFuncionario")
            {
                //Redireciona para a pagina de editar correspondente com o CPF como parametro
                Response.Redirect("~/Apresentacao/Funcionarios/EditarFuncionario.aspx?cpf=" + grdFuncionarios.Rows[Convert.ToInt16(e.CommandArgument)].Cells[2].Text);


            }
            else if (e.CommandName == "desligarFuncionario")
            {
                string cpf = grdFuncionarios.Rows[Convert.ToInt16(e.CommandArgument)].Cells[2].Text;
                //chama o servico que desliga o funcionario do hotel e verifica se o funcionário foi excluido
                if (servico.DesligarFuncionario(cpf))
                {
                    //Remove o cache para atualizar informação
                    HttpContext.Current.Cache.Remove("Lista_Funcionario");
                    MensagemJS("Funcionário desligado com sucesso!");
                }
                else
                {
                    MensagemJS("Ocorreu um erro e o funcionário não foi desligado!");
                }
                //Faz o reload da pagina para não perder os valores do "desligar"
                ReloadGridView();
            }


        }


        /// <summary>
        /// Evento de click do checkbox
        /// </summary>
        protected void ckbAtivos_CheckedChanged(object sender, EventArgs e)
        {
            //recupera todos os funcionarios do banco de dados  
              ReloadGridView();
        }


        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "Mensagem",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }

        /// <summary>
        /// Evento chamado a cada nova linha criada. O evento verificará se o funcionario está inativo. Se sim
        /// ele desabilita o botão de desligar, ou se não deixa habilitado
        /// </summary>
        protected void grdFuncionarios_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            string value = null;
            if (e.Row.RowType == DataControlRowType.DataRow) 
            {
                string nome = DataBinder.Eval(e.Row.DataItem, "Nome").ToString();
                ((LinkButton)e.Row.Cells[8].Controls[0]).OnClientClick = "return confirm('Deseja realmente desligar do hotel o funcionário " + nome + "?');"; 
               
                 //Pega o valor correspondente a coluna Ativo
                 value = DataBinder.Eval(e.Row.DataItem, "Ativo").ToString();

                   
            }
            //Se value for false desabilita o botao desligar
            if (value == "False")
            {
                e.Row.Cells[8].Text = "Desligado";
                e.Row.Cells[8].ForeColor = Color.Red;
                e.Row.Cells[8].BorderColor = Color.DarkBlue;
            }
         
        }

        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdFuncionarios_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

            //Consulta os funcionarios no banco
            funcionarios = servico.ListarFuncionariosCache();

            if (ckbAtivos.Checked == true)
            {
                funcionarios = funcionarios.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper()) && i.Ativo == true).OrderBy(i => i.Nome).ToList();
            }
            else
            {
                funcionarios = funcionarios.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Nome).ToList();
            }     

            //Na mudança de pagina, chama o evento de aparecer a lista
            grdFuncionarios.PageIndex = e.NewPageIndex;
            grdFuncionarios.DataSource = funcionarios;
            grdFuncionarios.DataBind();
        }

        /// <summary>
        /// Evento do botão de filtrar os nomes para facilitar a busca
        /// </summary>
        protected void btnBusca_Click(object sender, EventArgs e)
        {
            
            ReloadGridView();
        }      

        /// <summary>
        /// Limpa a busca
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtBusca.Text = null;
            ReloadGridView();
        }

        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {
            
            //Consulta os funcionarios no serviço. Nele será verificado o cache
            funcionarios = servico.ListarFuncionariosCache();
           
            if (ckbAtivos.Checked == true)
            {
                funcionarios = funcionarios.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper()) && i.Ativo == true).OrderBy(i => i.Nome).ToList();
            }
            else
            {
                funcionarios = funcionarios.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Nome).ToList();
            }              
           
            //popular gridView
            grdFuncionarios.DataSource = funcionarios;
            grdFuncionarios.DataBind();
                        
        }
        /// <summary>
        /// Evento do botão de cadastrar que chama a tela de cadastro
        /// </summary>
        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            //Redireciona para a pagina de cadastro
            Response.Redirect("~/Apresentacao/Funcionarios/CadastrarFuncionario.aspx");

        }
 
      

    }
}